package com.shuiyihan.design.creative.Singleton;

/**
 * 单例模式2 (多线程安全版)
 *
 * 确保某一个类中只有一个实例,而且自行实例化并向整个系统提供这个实例
 *
 * 1.单例类只能有一个实例
 * 2.单例类必须自己创建自己的唯一实例
 * 3.单例类必须给所有其他对象提供这一实例
 *
 * @author shuiyihan
 */
public class Singleton2 {

    /**
     * 1.单例类只能有一个实例
     **/
    private static Singleton2 singleton;

    /**
     * 2.单例类必须自己创建自己的唯一实例
     **/
    private Singleton2() {
    }

    /**
     * 3.单例类必须给所有其他对象提供这一实例
     **/
    public static Singleton2 getInstance() {
        //----->>>错误的双重检查锁(有些编译器由于性能考虑,此处有隐患)
        if (singleton == null) {
            //控制多线程安全
            synchronized (Singleton2.class) {
                if (singleton == null) {
                    //对象为空,创建对应实例
                    singleton = new Singleton2();
                }
            }
        }
        return singleton;
    }
}
